glreadpixels
- Man Page
glReadPixels(3G) OpenGL Reference glReadPixels(3G)
NAME
glReadPixels - read a block of pixels from the frame buffer
C SPECIFICATION
void glReadPixels( GLint x,
GLint y,
GLsizei width,
GLsizei height,
GLenum format,
GLenum type,
GLvoid *pixels )
PARAMETERS
x, y Specify the window coordinates of the first pixel that is read from
the frame buffer. This location is the lower left corner of a
rectangular block of pixels.
width, height
Specify the dimensions of the pixel rectangle. width and height of
one correspond to a single pixel.
format
Specifies the format of the pixel data. The following symbolic
values are accepted: GL_COLOR_INDEX, GL_STENCIL_INDEX,
GL_DEPTH_COMPONENT, GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA, GL_RGB,
GL_RGBA, GL_ABGR_EXT, GL_LUMINANCE, and GL_LUMINANCE_ALPHA.
type Specifies the data type of the pixel data. Must be one of
GL_UNSIGNED_BYTE, GL_BYTE, GL_BITMAP, GL_UNSIGNED_SHORT, GL_SHORT,
GL_UNSIGNED_INT, GL_INT, GL_FLOAT, GL_UNSIGNED_BYTE_3_3_2_EXT,
GL_UNSIGNED_SHORT_4_4_4_4_EXT, GL_UNSIGNED_SHORT_5_5_5_1_EXT,
GL_UNSIGNED_INT_8_8_8_8_EXT, or GL_UNSIGNED_INT_10_10_10_2_EXT.
pixels
Returns the pixel data.
DESCRIPTION
glReadPixels returns pixel data from the frame buffer, starting with the
pixel whose lower left corner is at location (x, y), into client memory
starting at location pixels. Several parameters control the processing
of the pixel data before it is placed into client memory. These
parameters are set with the commands glPixelStore, glPixelTransfer, and
glPixelMap. The state for the EXT_convolution, SGI_color_matrix,
EXT_histogram, and SGI_color_table extensions (see the reference pages
for glPixelTransfer, glConvolutionFilter2DEXT, glColorTableSGI,
glHistogramEXT, and glMinmaxEXT) also affect the results of glReadPixels.
This reference page describes the effects on glReadPixels of some, but
not all of the parameters specified by these commands.
Page 1
glReadPixels(3G) OpenGL Reference glReadPixels(3G)
glReadPixels returns values from each pixel with lower left-hand corner
at (x + i, y + j) for 0<iglReadPixels(3G) OpenGL Reference glReadPixels(3G)
GL_INDEX_SHIFT, and added to GL_INDEX_OFFSET. Indices are then
replaced by the red, green, blue, and alpha values obtained by
indexing the GL_PIXEL_MAP_I_TO_R, GL_PIXEL_MAP_I_TO_G,
GL_PIXEL_MAP_I_TO_B, and GL_PIXEL_MAP_I_TO_A tables. Each of
these tables must be of size 2^n, but n may be different for
different tables. Before an index is used to look up a value in
a table of size 2^n it must be masked against 2^n-1.
If RGBA color components are stored in the color buffers, they
are read from the color buffer selected by glReadBuffer. Each
color component is converted to floating point such that zero
intensity maps to 0.0 and full intensity maps to 1.0. Each
component is then multiplied by GL_c_SCALE and added to
GL_c_BIAS, where c is RED, GREEN, BLUE, or ALPHA. Finally, if
GL_MAP_COLOR is GL_TRUE, Each component is clamped to the range
[0,1], scaled to the size of its corresponding table, and is
then replaced by its mapping in the table GL_PIXEL_MAP_c_TO_c,
where c is R, G, B, or A.
Unneeded data is then discarded. For example, GL_RED discards
the green, blue, and alpha components, while GL_RGB discards
only the alpha component. GL_LUMINANCE computes a single
component value as the sum of the red, green, and blue
components, and GL_LUMINANCE_ALPHA does the same, while keeping
alpha as a second value. The final values are clamped to the
range [0,1].
The shift, scale, bias, and lookup factors described above are all
specified by glPixelTransfer. The lookup table contents themselves are
specified by glPixelMap.
The final step involves converting the indices or components to the
proper format, as specified by type. If format is GL_COLOR_INDEX or
GL_STENCIL_INDEX and type is not GL_FLOAT, each index is masked with the
mask value given in the following table.
________________________________
|__________________|____________|
| | |
|GL_UNSIGNED_BYTE | 2^8-1 |
| GL_BYTE | 2^7-1 |
| GL_BITMAP | 1 |
|GL_UNSIGNED_SHORT | 2^16-1 |
| GL_SHORT | 2^15-1 |
| GL_UNSIGNED_INT | 2^32-1 |
|__________________|____________|
If type is GL_FLOAT, then each integer index is converted to single-
precision floating-point format.
Page 3
glReadPixels(3G) OpenGL Reference glReadPixels(3G)
If format is GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA, GL_RGB, GL_RGBA,
GL_ABGR_EXT, GL_LUMINANCE, or GL_LUMINANCE_ALPHA each component is first
clamped to [0,1]. If type is not GL_FLOAT, each component is then
multiplied by the multiplier shown in the following table. Equations
with N as the exponent are performed for each bitfield of the packed data
type, with N set to the number of bits in the bitfield.
_______________________________________________________
|_______________________________|______________________|
| | |
| GL_UNSIGNED_BYTE | (2^8-1)c |
| GL_BYTE | [(2^8-1)c-1]/2 |
| GL_BITMAP | 1 |
| GL_UNSIGNED_SHORT | (2^16-1)c |
| GL_SHORT | [(2^16-1)c-1]/2 |
| GL_UNSIGNED_INT | (2^32-1)c |
| GL_INT | [(2^32-1)c-1]/2 |
| GL_UNSIGNED_BYTE_3_3_2_EXT | (2^N-1)c |
|GL_UNSIGNED_SHORT_4_4_4_4_EXT | (2^N-1)c |
|GL_UNSIGNED_SHORT_5_5_5_1_EXT | (2^N-1)c |
| GL_UNSIGNED_INT_8_8_8_8_EXT | (2^N-1)c |
|GL_UNSIGNED_INT_10_10_10_2_EXT | (2^N-1)c |
|_______________________________|______________________|
If type is GL_FLOAT, then each component is passed as is (or converted to
the client's single-precision floating-point format if it is different
from the one used by the GL).
Return values are placed in memory as follows. If format is
GL_COLOR_INDEX, GL_STENCIL_INDEX, GL_DEPTH_COMPONENT, GL_RED, GL_GREEN,
GL_BLUE, GL_ALPHA, or GL_LUMINANCE, a single value is returned and the
data for the ith pixel in the jth row is placed in location
(j) width + i. GL_RGB returns three values, GL_RGBA and GL_ABGR_EXT
return four values, and GL_LUMINANCE_ALPHA returns two values for each
pixel, with all values corresponding to a single pixel occupying
contiguous space in pixels. (If type is a packed data format then all the
elements of each group are stored in a a single unsigned byte, unsigned
short, or unsigned int.) Storage parameters set by glPixelStore, such as
GL_PACK_SWAP_BYTES and GL_PACK_LSB_FIRST, affect the way that data is
written into memory. See glPixelStore for a description.
NOTES
Values for pixels that lie outside the window connected to the current GL
context are undefined.
If an error is generated, no change is made to the contents of pixels.
If type is set to GL_UNSIGNED_BYTE_3_3_2_EXT,
GL_UNSIGNED_SHORT_4_4_4_4_EXT, GL_UNSIGNED_SHORT_5_5_5_1_EXT,
GL_UNSIGNED_INT_8_8_8_8_EXT, or GL_UNSIGNED_INT_10_10_10_2_EXT and the
EXT_packed_pixels extension is not supported then a GL_INVALID_ENUM error
is generated.
Page 4
glReadPixels(3G) OpenGL Reference glReadPixels(3G)
ERRORS
GL_INVALID_ENUM is generated if format or type is not an accepted value.
GL_INVALID_VALUE is generated if either width or height is negative.
GL_INVALID_OPERATION is generated if format is GL_COLOR_INDEX and the
color buffers store RGBA color components.
GL_INVALID_OPERATION is generated if format is GL_STENCIL_INDEX and there
is no stencil buffer.
GL_INVALID_OPERATION is generated if format is GL_DEPTH_COMPONENT and
there is no depth buffer.
GL_INVALID_OPERATION is generated if glReadPixels is executed between the
execution of glBegin and the corresponding execution of glEnd.
ASSOCIATED GETS
glGet with argument GL_INDEX_MODE
MACHINE DEPENDENCIES
RealityEngine, RealityEngine2, and VTX systems do not support convolving
images as they are read from the framebuffer.
Loading a convolution filter with some combinations of pixel transfer
modes may be unreliable on InfiniteReality systems. Straightforward
transfers are known to work, though. The remaining problems will be
fixed in the next release.
On RealityEngine, RealityEngine2, and VTX systems, histogramming and
minmax never sink pixel data that is being read from the framebuffer.
The EXT_packed_pixels extension is not supported on RealityEngine,
RealityEngine2, and VTX systems; it will be supported on High Impact and
Maximum Impact systems in a future release.
The following problems are known to exist on RealityEngine,
RealityEngine2, and VTX systems:
1. Texturing must be disabled for glReadPixels to function
correctly.
2. It is not possible to read the depth or stencil buffers of
multisample-capable Visuals.
3. Reading the depth-buffer is much slower than reading a color-
buffer.
4. Reading RGBA format data from a color-index window does not work
correctly.
Page 5
glReadPixels(3G) OpenGL Reference glReadPixels(3G)
The first software release for InfiniteReality systems has the following
known problems, all of which will be fixed in the next release:
1. GL_BITMAP is not supported.
2. The implementation has not been fully optimized.
3. When reading back GL_GREEN or GL_BLUE-format values from a
luminance-only window, the returned values are not zero.
SEE ALSO
glCopyPixels, glDrawPixels, glPixelMap, glPixelStore, glPixelTransfer,
glReadBuffer
Page 6